package com.wuhainan.beelzebub.utils.tree;

import java.util.ArrayList;
import java.util.List;

/**
 * list递归生成树形结构
 * <br>Created by 吴海南 on 2017-12-21.
 * <br>星期四 at 上午 8:56.
 */
public class TreeParser {

    /**
     * 解析树形数据
     *
     * @param topId      顶层id
     * @param entityList 数据集合
     * @param <T>        泛型类
     * @return 返回树形集合
     */
    public static <T extends TreeEntity<T>> List<T> getTreeList(String topId, List<T> entityList) {
        List<T> resultList = new ArrayList<>();

        //获取顶层元素集合
        String parentId;
        for (T entity : entityList) {
            parentId = entity.getParentId();
            if (parentId == null || topId.equals(parentId)) {
                resultList.add(entity);
            }
        }
        //获取每个顶层元素的子数据集合
        for (T entity : resultList) {
            entity.setChildren(getSubList(entity.getId(), entityList));
        }
        return resultList;
    }

    /**
     * 获取子数据集合
     *
     * @param id         数据id
     * @param entityList 数据集合
     * @param <T>        泛型
     * @return 返回子集合
     */
    private static <T extends TreeEntity<T>> List<T> getSubList(String id, List<T> entityList) {
        List<T> childList = new ArrayList<>();
        String parentId;
        //子集的直接子对象
        for (T entity : entityList) {
            parentId = entity.getParentId();
            if (id.equals(parentId)) {
                childList.add(entity);
            }
        }
        //子集的间接子对象
        for (T entity : childList) {
            entity.setChildren(getSubList(entity.getId(), entityList));
        }
        //递归退出条件
        if (childList.size() == 0) {
            return null;
        }
        return childList;
    }
}
